package com.jzo2o.orders.manager.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.jzo2o.api.market.dto.response.AvailableCouponsResDTO;
import com.jzo2o.common.model.msg.TradeStatusMsg;
import com.jzo2o.orders.base.model.domain.Orders;
import com.jzo2o.orders.manager.model.dto.request.OrdersPayReqDTO;
import com.jzo2o.orders.manager.model.dto.request.PlaceOrderReqDTO;
import com.jzo2o.orders.manager.model.dto.response.OrdersPayResDTO;
import com.jzo2o.orders.manager.model.dto.response.PlaceOrderResDTO;

import java.util.List;

/**
 * <p>
 * 下单服务类
 * </p>
 *
 * @author itcast
 * @since 2023-07-10
 */
public interface IOrdersCreateService extends IService<Orders> {

    /**
     * 下单接口
     *
     * @param placeOrderReqDTO 下单请求信息
     * @return 下单响应信息
     */
    PlaceOrderResDTO place(PlaceOrderReqDTO placeOrderReqDTO);

    /**
     * 插入下单数据无优惠
     *
     * @param orders 下单数据
     */
    void add(Orders orders) ;

    /**
     * 分布式锁下单接口
     *
     * @param userId
     * @param serveStartTime
     * @param placeOrderReqDTO
     * @return
     */
    PlaceOrderResDTO place(Long userId, long serveStartTime, PlaceOrderReqDTO placeOrderReqDTO);

    /**
     * 订单支付
     *
     * @param id              订单id
     * @param ordersPayReqDTO 订单支付请求体
     * @return 订单支付响应体
     */
    OrdersPayResDTO pay(Long id, OrdersPayReqDTO ordersPayReqDTO);

    /**
     * 请求支付服务查询支付结果
     *
     * @param id 订单id
     * @return 订单支付结果
     */
    OrdersPayResDTO getPayResultFromTradServer(Long id);

    /**
     * 支付成功， 更新数据库的订单表及其他信息
     *
     * @param tradeStatusMsg 交易状态消息
     */
    void paySuccess(TradeStatusMsg tradeStatusMsg);

    /**
     * 查询指定数量的超时订单
     * @param i 数量
     * @return
     */
    List<Orders> queryOverTimePayOrdersListByCount(int i);

    /**
     * 获取可用优惠券
     * @param serveId
     * @param purNum
     * @return
     */
    List<AvailableCouponsResDTO> getCoupons(Long serveId, Integer purNum);

    /**
     * 插入下单数据有优惠
     *
     * @param orders
     * @param couponId
     */
    void addWithCoupon(Orders orders, Long couponId);
}
